#include "accesgate.h"

/*zwraca -1 jesli nie znalazl wolnego deskryptora, lub ofset deksryptra jesli znalazl*/
int saveNew(Command *c, DesMenager *desMen, int fd, int fk){

	string MODULE_NAME("saveNew");
	Record *record =new Record();
	int result=-1;//zwracana wartosc
//	DEBUG(MODULE_NAME,(int)c->type[0]);
//	DEBUG(MODULE_NAME,(int)c->type[1]);
//	DEBUG(MODULE_NAME,(int)c->type[2]);
//	DEBUG(MODULE_NAME,(int)c->type[3]);
//	DEBUG(MODULE_NAME,(int)c->type[4]);

	record->setFromComIn(c);
	unsigned int dataOfset;
	 // pobieram ofset deskrytora dla danego rekordu
	//cout<<"zabieram sie do wyszukania pustego des"<<endl;
	DEBUGINFO(MODULE_NAME,"Szukam pustego deskryptora");
	int *ofsetDes = new int; *ofsetDes=345;
	unsigned int *size=new unsigned int;
	unsigned int *orginalSize=new unsigned int;
	*orginalSize=record->getSize();
	//cout << "ofset przed wyszukaniem: "<<*ofsetDes<<endl;
	desMen->findEmptyDes(record->getSize(), ofsetDes, size);
	//DEBUGINFO(MODULE_NAME, "Znalazlem deskryptor z ofsetem...");
	//DEBUG(MODULE_NAME,*ofsetDes);
			if(*ofsetDes==-1){//czyli nie znaleziono deskryptora
	           return result;
			}
	record->setBooked(1);
	if(*size==0)
	{//trzeba zobaczyć jaki ofset mam poprzedni deskryptor zeby wiedziec  jaki ofset mają dane

		record->setSize(*orginalSize);
		if(*ofsetDes==0)
			dataOfset=0;
		else dataOfset=desMen->createDataOfset(*ofsetDes);
			record->setOfset(dataOfset);
	}
	else
	{
		record->setSize(*size);

	}
	//zapisanie deskryptora
	char *desBuf =new char[DESLENGTH];
	desBuf=record->createDesBuf();
	lseek(fd, *ofsetDes, SEEK_SET);
	write(fd, desBuf, DESLENGTH);
		//tworzy bufor z deskryptora i zapisuje
	char * krotBuf=record->createKrotBuf(c->type,*orginalSize);
	lseek(fk, dataOfset, SEEK_SET);
	write(fk, krotBuf, *orginalSize);
	result=*ofsetDes;
	desMen->unlock();
	delete(size);
	delete(orginalSize);
	delete(record);
	return result;


}

void deleteRec(int d, DesMenager *des){

	des->deactive(d);
};

int  search(Command *c, DesMenager *descManager, int fk, Record **record)
{
	string MODULE_NAME("search");
	int n = 0;
	int result;
	RecordDescriptor *recordDesc=new RecordDescriptor();
	RecordDescriptor *tempRecordDesc=recordDesc;
	for(int i =0; i<ELEMENTCOUNT;++i)
		recordDesc->type[i]=c->type[i];
	//cout <<"szukany deskryptor: "<<endl;
	//recordDesc->wypisz();
	while(1) {
	result=descManager->findSimilary(&n,&recordDesc);
	DEBUG(MODULE_NAME, result);
	if(result==1)
	{
		cout << "znaleziono pasujący deksryptor"<<endl;
		Tuple k,ks;
		unsigned int size=recordDesc->getSize();
		char *bufK=new char[size];
		lseek(fk, recordDesc->getOfset(), SEEK_SET);
		read(fk, bufK, size);
		//cout<<"czyta krotke z pliku"<<endl;
		k.createFromBuf(bufK, recordDesc->getType());
//		cout <<"$%#%^^!#$!*&$@!*&$@!*&@!%*&%@!*&^%@!*&%!@*&^%@!*&%@!&*%@!*&@!"<<endl;
//		recordDesc->wypisz();
//		k.wypisz();
		//cout<<"tworzy krotke z zapytania"<<endl;
		ks.setFromCom(c);

		//desMem->unlock();
		//des=tempDes;

		if(k.isSimilar(ks, c->operation))
		{
			DEBUGINFO(MODULE_NAME,"Znalazłem pasujący deksryptor:");
			cout <<"$%#%^^!#$!*&$@!*&$@!*&@!%*&%@!*&^%@!*&%!@*&^%@!*&%@!&*%@!*&@!"<<endl;
			recordDesc->wypisz();
			k.wypisz();
		//	DEBUGINFO(MODULE_NAME,"Szukalem:");
		//	ks.wypisz();
			(*record) = new Record(recordDesc, &k);
		    DEBUG(MODULE_NAME,(int)record);
			return n;
		}
		descManager->unlock();
		//cout <<"probujemy z kolejnym deskryptorem i n:"<<*n<<endl;
	}
	else
	{
		//cout << "nie znaleziono odpowiedniej krotki"<<endl;
		n= -1 ;
		(*record)=0;
		return -1;
	}



	}
}
